package net.suplementos.negocio;

import java.util.Date;
import java.util.List;

import javax.naming.InitialContext;
import javax.naming.NamingException;

import net.suplementos.exception.CampoObrigatorioException;
import net.suplementos.exception.ErroInternoException;
import net.suplementos.exception.RegistroInexistenteException;
import net.suplementos.pojo.Atendimento;
import net.suplementos.pojo.Cliente;
import net.suplementos.pojo.Despesa;
import net.suplementos.pojo.FormaPagamento;
import net.suplementos.pojo.Produto;
import net.suplementos.pojo.ProdutoAtendimento;
import net.suplementos.pojo.Usuario;
import net.suplementos.pojo.Venda;
import net.suplementos.servico.FinanceiroServico;
import net.suplementos.vo.MovimentoCaixaVO;


public class FinanceiroDelegate implements FinanceiroServico {

    private static FinanceiroServico delegate;
    private InitialContext context;
    
    private FinanceiroDelegate() {
        try {
            context = new InitialContext();
        } catch (NamingException e) {
            throw new ErroInternoException(e.getMessage(), e);
        }
    }
    
    public static FinanceiroServico getInstance() {
        if (delegate == null) {
            delegate = new FinanceiroDelegate();
        }
        
        return delegate;
    }
    
    private FinanceiroServico getRemote() {
        try {
            return (FinanceiroServico) context.lookup("/net/suplementos/facade/Financeiro/remote");
        } catch (NamingException e) {
            throw new ErroInternoException(e.getMessage(), e);
        }
    }

	public List<Despesa> consultarDepesas(String nome, String descricao, Date dataInicioPg, Date dataFimPg, Date dataInicioVen, Date dataFimVen) throws CampoObrigatorioException {
	    return getRemote().consultarDepesas(nome, descricao, dataInicioPg, dataFimPg, dataInicioVen, dataFimVen);
	}

	public Despesa getDespesa(Integer id) {
        return getRemote().getDespesa(id);
	}

	public void alterar(Despesa despesa) throws CampoObrigatorioException, RegistroInexistenteException {
        getRemote().alterar(despesa);
	}

	public void salvar(Despesa despesa) throws CampoObrigatorioException {
        getRemote().salvar(despesa);
	}
	
	public List<MovimentoCaixaVO> movimentoDia() {
        return getRemote().movimentoDia();
	}
	
	public List<Venda> listarSolicitacoesDescontoPendentes() {
        return getRemote().listarSolicitacoesDescontoPendentes();
	}
	
	public List<Atendimento> listarAtendimentosRealizados() {
        return getRemote().listarAtendimentosRealizados();
	}
	
	public List<ProdutoAtendimento> consultarListaProdutoAtendimento(Atendimento atendimento) {
		return getRemote().consultarListaProdutoAtendimento(atendimento);
	}
	
	public List<Venda> consultarVendasRealizadas(Date dataInicio, Date dataFim) throws CampoObrigatorioException {
        return getRemote().consultarVendasRealizadas(dataInicio, dataFim);
	}
	
	public void estornarVenda(Venda venda) throws CampoObrigatorioException, RegistroInexistenteException {
        getRemote().estornarVenda(venda);
	}	
	
	public void permitirDesconto(Venda venda, boolean permitirDesconto) throws CampoObrigatorioException, RegistroInexistenteException {
        getRemote().permitirDesconto(venda, permitirDesconto);
	}

	public Venda getVenda(Integer id) {
	    return getRemote().getVenda(id);
	}
	
	public Atendimento iniciarAtendimento(Usuario vendedor, Cliente cliente, String identificador) throws CampoObrigatorioException {
	    return getRemote().iniciarAtendimento(vendedor, cliente, identificador);

	}
	
	public void finalizarAtendimento() {
	    getRemote().finalizarAtendimento();
	}
	
	public void cancelarAtendimento() {
	    getRemote().cancelarAtendimento();
	}
	
	public Venda iniciarVenda(Atendimento atendimento) throws RegistroInexistenteException {
	    return getRemote().iniciarVenda(atendimento);

	}
	
	public void finalizarVenda(Venda venda) {
	    getRemote().finalizarVenda(venda);
	}
	
	public void cancelarVenda(Venda venda) {
	    getRemote().cancelarVenda(venda);
	}

	public void solicitarDesconto(Venda venda) {
	    getRemote().solicitarDesconto(venda);
	}

	public void adicionarProdutoAtendimento(Produto produto, Atendimento atendimento, Short quantidade) throws CampoObrigatorioException, RegistroInexistenteException  {
	    getRemote().adicionarProdutoAtendimento(produto, atendimento, quantidade);
		
	}

	public void adicionarFormaPagamentoVenda(FormaPagamento formaPagamento, Venda venda, float valor) throws CampoObrigatorioException, RegistroInexistenteException  {
	    getRemote().adicionarFormaPagamentoVenda(formaPagamento, venda, valor);
		
	}
	
	public void excluirFormaPagamentoVenda(FormaPagamento formaPagamento, Venda venda) throws RegistroInexistenteException  {
	    getRemote().excluirFormaPagamentoVenda(formaPagamento, venda);
		
	}
	
	public void excluirProdutoAtendimento(Produto produto, Atendimento atendimento) throws RegistroInexistenteException  {
	    getRemote().excluirProdutoAtendimento(produto, atendimento);
		
	}
	
	public void alterarQtdProdutoAtendimento(Produto produto, Atendimento atendimento, short quantidade) throws CampoObrigatorioException, RegistroInexistenteException  {
	    getRemote().alterarQtdProdutoAtendimento(produto, atendimento, quantidade);
	}
	
	public void indicarClienteAtendimento(Atendimento atendimento, Cliente cliente) throws RegistroInexistenteException  {
	    getRemote().indicarClienteAtendimento(atendimento, cliente);
	}

	public Atendimento getAtendimento(Integer id) {
		return getRemote().getAtendimento(id);
	}

}
